package com.baizhi.controller;

import com.baizhi.annotation.LogAnnotation;
import com.baizhi.entity.CmfzUser;
import com.baizhi.service.CmfzUserService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("cmfzUser")
public class CmfzUserController {
    @Autowired
    private CmfzUserService cmfzUserService;


    @RequestMapping("show")
    @LogAnnotation(content = "查询用户信息",type = "查询")//自定义注解
    //@RequiresPermissions("user:show")//注解式授权  只有拥有user：show的管理员才能方法此方法
    @RequiresRoles(value = "superadmin")//说明superadmin角色的管理员能方法此方法
    public Map showUser(String userTelphone,Integer page,Integer limit){
        Map map = new HashMap();
        Page<CmfzUser> userPage = cmfzUserService.selectPage(userTelphone, page, limit);
        map.put("code",0);
        map.put("msg","");
        map.put("count",userPage.getTotal());
        map.put("data",userPage.getRecords());
        return map;
    }
    @RequestMapping("update")
    @LogAnnotation(content = "更新用户信息",type = "修改")
    @RequiresRoles(value = "superadmin")//只有拥有superadmin的角色的管理员  才能方法修改用户方法
    public Map updateUser(Integer userId){
        Map map = new HashMap();
        try {
            cmfzUserService.updateCmfzUser(userId);
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }

    @RequestMapping("showBoyAndGril")
    @LogAnnotation(content = "查询用户男女比例信息",type = "查询")
    @RequiresRoles(value = "admin")//说明admin角色的管理员能方法此方法
    public List<Integer> selectSizeBySix(){
        List<Integer> list = cmfzUserService.selectBoyAndGril();
        return list;
    }

    @RequestMapping("showByDateWeek")
    @LogAnnotation(content = "查询用户注册量信息",type = "查询")
    @RequiresRoles(value = "admin")
    public List<Integer> selectSizeByDate(){
        List<Integer> list = cmfzUserService.selectByDateWeek();
        return list;
    }
    @RequestMapping("showByDateWeek2")
    @LogAnnotation(content = "查询用户注册量信息2",type = "查询")
    @RequiresRoles(value = "admin")
    public List<Integer> selectSizeByDate3(){
        List<Integer> list = cmfzUserService.selectByDateWeek2();
        return list;
    }

    @RequestMapping("showProvinceSize")
    @LogAnnotation(content = "查询用户省份分布信息",type = "查询")
    @RequiresRoles(value = "admin")
    public List<Map> selectByProvince(){
        List<Map> maps = cmfzUserService.selectByProvince();
        return maps;
    }

    //将三个图表展示的方法  封装到一个方法中  这样页面只需发一个ajax请求即可
    @RequestMapping("showEcharts")
    @LogAnnotation(content = "Echarts展示用户信息",type = "查询")
    @RequiresRoles(value = "admin")
    public Map showEcharts(){
        Map map = new HashMap();
        List<Integer> list1 = cmfzUserService.selectBoyAndGril();
        List<Integer> list2 = cmfzUserService.selectByDateWeek2();
        System.out.println(list2);
        List<Map> list3 = cmfzUserService.selectByProvince();
        map.put("userSex",list1);
        map.put("userDate",list2);
        map.put("userProvince",list3);
        return map;
    }
    //将三个图表展示的方法  封装到一个方法中  并且用多线程实现优化
    @RequestMapping("showEchartsByThread")
    @LogAnnotation(content = "线程优化Echarts统计用户信息",type = "查询")
    @RequiresRoles(value = {"superadmin"})
    public Map showEchartsByThread(){
        Map map = cmfzUserService.selectCountByThread();
        return map;
    }
    @RequestMapping("showEchartsByThread2")
    @LogAnnotation(content = "线程优化Echarts统计用户信息2",type = "查询")
    @RequiresRoles(value = {"superadmin","admin"})//说明superadmin和admin两个角色的管理员都能方法此方法
    public Map showEchartsByThread2(){
        Map map = cmfzUserService.selectCountByThread2();
        //注意  这个返回的map中封装的value中的list集合中的泛型和上面的不一样
        // 这里的map中封装了三个键值对 {"sex",list}{"count",list}{"province",list}
        //      并且三个value（list）的泛型都是Map类型
        return map;
    }
}
